﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SeguroSoft.Model.Model;

namespace SeguroSoft.Models
{
    public class RepositorioRevisionTecnica : SeguroSoft.Models.IRepositorioRevisionTecnica
    {
        SeguroSoftDBDataContext db = new SeguroSoftDBDataContext();

        /// <summary>
        /// Devuelve todas las reviciones tecnicas
        /// </summary>
        /// <returns></returns>
        public IQueryable<RevisionTecnica> EncontrarTodasLasRevisiones() {

            return db.RevisionTecnicas;
        }


        /// <summary>
        /// Retorna una lista con las revisiones que cumplen las restricciones. Opcion=1 -->revisiones con costo mayor; Opcion=2--> Revisiones con costo menor; Opcion=3 --> Revision con igual valor
        /// </summary>
        /// <param name="costo"></param>
        /// <param name="opcion"></param>
        /// <returns></returns>
        public IQueryable<RevisionTecnica> EncontrarRevisionPorPrecio(double costo,int opcion) {

            if (opcion == 1)
            {
                return from revision in db.RevisionTecnicas
                       where double.Parse(revision.Costo.ToString()) >= costo
                       orderby double.Parse(revision.Costo.ToString())
                       select revision;
            }
            else if (opcion == 2)
            {
                return from revision in db.RevisionTecnicas
                       where double.Parse(revision.Costo.ToString()) <= costo
                       orderby double.Parse(revision.Costo.ToString())
                       select revision;
            }

            else {
                return from revision in db.RevisionTecnicas
                       where double.Parse(revision.Costo.ToString()) == costo
                       orderby double.Parse(revision.Costo.ToString())
                       select revision;
            
            
            }


        }

        /// <summary>
        /// Entrega las revisiones que sean en esa comuna
        /// </summary>
        /// <param name="comuna"></param>
        /// <returns></returns>
        public IQueryable<RevisionTecnica> EncontrarRevisionPorComuna(string comuna)
        {

                return from revision in db.RevisionTecnicas
                       where revision.Comuna.ToLower().Contains(comuna.ToLower())
                       select revision;

        }

        /// <summary>
        /// Encuentra las revisiones tecnicas por tipo(string)
        /// </summary>
        /// <param name="tipo"></param>
        /// <returns></returns>
        public IQueryable<RevisionTecnica> EncontrarRevisionPorTipo(string tipo)
        {

            return from revision in db.RevisionTecnicas
                   where revision.TipoRevision.Equals(tipo)
                   select revision;

        }

        /// <summary>
        /// Busca revisiones por tiempo de espera 1--> Mayor a; 2--> Menor a; 3 --> Igual a
        /// </summary>
        /// <param name="tiempoespera"></param>
        /// <param name="opcion"></param>
        /// <returns></returns>
        public IQueryable<RevisionTecnica> EncontrarRevisionPorTiempoEspera(int tiempoespera, int opcion)
        {

            if (opcion == 1)
            {
                return from revision in db.RevisionTecnicas
                       where int.Parse(revision.TiempoEspera.ToString()) >= tiempoespera
                       orderby int.Parse(revision.TiempoEspera.ToString())
                       select revision;
            }
            else if (opcion == 2)
            {
                return from revision in db.RevisionTecnicas
                       where int.Parse(revision.TiempoEspera.ToString()) <= tiempoespera
                       orderby int.Parse(revision.TiempoEspera.ToString())
                       select revision;
            }

            else
            {
                return from revision in db.RevisionTecnicas
                       where int.Parse(revision.TiempoEspera.ToString()) == tiempoespera
                       orderby int.Parse(revision.TiempoEspera.ToString())
                       select revision;


            }


        }


        /// <summary>
        /// Elimina una RevisionTecnica
        /// </summary>
        /// <param name="revision"></param>
        public void EliminarRevision(RevisionTecnica revision) {
            db.RevisionTecnicas.DeleteOnSubmit(revision);
        }

        /// <summary>
        /// Guarda los cambios
        /// </summary>
        public void Guardar()
        {
            db.SubmitChanges();
        }




        public RevisionTecnica EncontarRevisionPorId(int id)
        {
            return db.RevisionTecnicas.SingleOrDefault(d => d.IDRevisionTecnica == id);
        }

        /// <summary>
        /// Entrega una lista con todas las comunas de 
        /// la tabla (si dos comunas estan escritas de forma diferente (escribe dos comunas diferentes)
        /// </summary>
        /// <returns></returns>
        public List<string> ListarComunas()
        {
            List<RevisionTecnica> revisiones = EncontrarTodasLasRevisiones().ToList();
            List<string> resultados = new List<string>();
            
            if (revisiones != null)
            {
                foreach (RevisionTecnica r in revisiones)
                {
                    if (!resultados.Contains(r.Comuna))
                    {
                        resultados.Add(r.Comuna);
                    }
                }

            }

            return resultados;
        }

        /// <summary>
        /// Entrega la lista de todas las compañias, asociadas a la tabla
        /// </summary>
        /// <returns></returns>
        public List<string> ListarCompañias()
        {
            List<RevisionTecnica> revisiones = EncontrarTodasLasRevisiones().ToList();
            List<string> resultados = new List<string>();

            if(revisiones!=null)
           {
               foreach (RevisionTecnica r in revisiones)
               {
                   List<CompañiaRT> compañiaActual = r.CompañiaRTs.ToList();
                   if (compañiaActual.Count != 0 && !resultados.Contains(compañiaActual.First().Nombre))
                   {
                       resultados.Add(compañiaActual.First().Nombre);
                   }
               }
           }

            return resultados;

        }

        public IQueryable<RevisionTecnica> EncontrarPorParametroGeneral(string parametro)
        {
            return from revision in db.RevisionTecnicas
                       where (revision.TiempoEspera.ToString().Equals(parametro) || revision.Calle.Contains(parametro)
                       || revision.Comuna.Contains(parametro) || revision.Costo.Contains(parametro) || revision.TipoRevision.Contains(parametro)
                       ||(revision.CompañiaRTs!=null && revision.CompañiaRTs.ToList().First().Nombre.Contains(parametro)) )
                       orderby revision.Comuna
                       select revision;
        }

        public CompañiaRT getCompañia(int id)
        {
            return db.CompañiaRTs.SingleOrDefault(p => p.IDCompañiaRT == id);
        }

        public string getNombreCompañia(int id)
        {
            return getCompañia(id).Nombre;
        }

        public List<Comentario> ObtenerComentariosRevision(int idrev)
        {
            IQueryable<int> ids = from comentario in db.TIRTs
                                  where comentario.IDRevisionTecnica == idrev
                                  select comentario.IDComentario;
            List<Comentario> comentarios = new List<Comentario>() ;
            foreach (int i in ids)
            {
                IQueryable<Comentario> aux = from c in db.Comentarios
                                             where c.IDComentario == i
                                             orderby c.Fecha
                                             select c;
                comentarios.AddRange(aux.ToList());
            }

            return comentarios;
        }

        public void crearTirt(TIRT tirt)
        {
            db.TIRTs.InsertOnSubmit(tirt);
            this.Guardar();
        }

       

    }
}